-- @author: errorcpp@qq.com
-- @brief: lua的oop实践
--  1.lua中在调用函数的时候“:”和“.”的区别是：是否自动传入self
--  2.和js类似，setmetable相当于prototype.直接在prototype中定义的是整个类型共享的数据，self上是对象持有的数据

-- 定义一个名字空间
if(nil == xlib) then xlib = {} end

-- 定义一个类
local OOPClass = {_oop_class_type = "OOPClass"}

-- 定义OOPClass的构造函数
function OOPClass:new()
    local self = {}
    self._oop_class_id   = 0
    --self._oop_class_type = "OOPClass"
    setmetatable(self, {__index = OOPClass})

    return self
end

-- 定义OOPClass的一个成员函数
function OOPClass:MemberFunction()
    print("OOPClass:MemberFunction: class_id=%d", self._oop_class_id)
end


-- 导出到xlib
xlib.OOPClass = OOPClass

local obj = xlib.OOPClass.new();
obj:MemberFunction();
local obj1 = OOPClass.new();
obj1:MemberFunction();
obj1._oop_class_id = 1;
obj1._oop_class_type = 123;
print("end")